package com.iflytek.cosmo.ocr.service;

import com.iflytek.cosmo.ocr.common.enums.ExportTaskStatusEnum;
import com.iflytek.cosmo.ocr.model.entity.ExportTaskEntity;

import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * @author <a href=mailto:ktyi@iflytek.com>伊开堂</a>
 * @date 2019/12/3 10:23
 */
public interface ExportTaskService {

    boolean create(ExportTaskEntity newTask);

    List<ExportTaskEntity> find(String fileIds, String exportFormat);

    boolean update(String taskId, ExportTaskStatusEnum targetStatus, String filePath);
    
    void delete(List<String> taskIds);

    boolean deleteByTaskId(String taskId);

    /**
     * 根据文件 id 查询导出任务
     *
     * @param fileId 文件 id
     *
     * @return 包含该文件id 的导出任务
     */
    List<ExportTaskEntity> findByFileId(String fileId);

    /**
     * 根据文件 id 查询导出任务
     *
     * @param fileIds 文件id集合
     *
     * @return 包含该文件id 的导出任务
     */
    List<ExportTaskEntity> findByFileId(List<String> fileIds);

    /**
     * 根据 fileId 批量清理任务(删除数据库数据 + fastDFS 文件)
     * 适用于更新文件 ocr 识别结果/文件重命名等情况
     *
     * @param fileIds 文件 id 集合
     *
     * @return 删除成功的数据条数
     */
    int cleanupByFileId(List<String> fileIds);

    /**
     * 根据 fileId 批量清理任务(删除数据库数据 + fastDFS 文件)
     * 适用于更新文件 ocr 识别结果/文件重命名等情况
     *
     * @param fileId 文件 id
     *
     * @return 删除成功的数据条数
     */
    int cleanupByFileId(String fileId);

    /**
     * 批量清理任务(删除数据库数据 + fastDFS 文件)
     *
     * @param tasks 待删除的任务集合
     *
     * @return 删除成功的数据条数
     */
    int cleanup(List<ExportTaskEntity> tasks);

    /**
     * 查询过期的导出任务
     *
     * @param keepAliveTime 存活时间
     * @param timeUnit      时间单位
     *
     * @return 超过存活时间的数据
     */
    List<ExportTaskEntity> findExpiredTask(int keepAliveTime, TimeUnit timeUnit);

    /**
     * 查询超时处理任务
     * @param overTimeMinute
     */
    List<String> findOverTimeProcessingTask(int overTimeMinute);

    /**
     * 删除超时任务
     * @param overTimeTaskIdList
     */
    void deleteOverTimeTask(List<String> overTimeTaskIdList);

    /**
     * 查询已经完成的子任务
     */
    List<ExportTaskEntity> findFinishTask(List<String> fileIds, String exportFormat, ExportTaskStatusEnum exportTaskStatusEnum);
}
